//File  : bitwise_operator.go
//Author: duanhaobin
//Date  : 2020/4/26

package main

import "fmt"

func main() {
	/*
		位运算符：
			将数值，转为二进制后，按位操作
		按位&：
			对应位的值如果都为1才为1，有一个为0就为0
		按位|：
			对应位的值如果都是0才为0，有一个为1就为1
		异或^：
			二元：a^b  同0不同1
				对应位的值不同为1，相同为0
			一元：^a
				按位取反：
					1--->0
					0--->1
		位清空：&^      1变0不变
				对于 a &^ b
					对于b上的每个数值
					如果为0，则取a对应位上的数值
					如果为1，则结果位就取0

		位移运算符：
		<<：按位左移，将a转为二进制，向左移动b位
			a << b
		>>: 按位右移，将a 转为二进制，向右移动b位
			a >> b
	*/
	a := 60
	b := 21
	/*
	二进制数表示：
	a  0011 1100
	b  0001 0101

	&  0001 0100
	|  0011 1101
	^  0010 1001
	&^ 0010 1000
	 */

	fmt.Printf("a 十进制为：%d，二进制为：%b\n",a,a)
	fmt.Printf("b 十进制为：%d，二进制为：%b\n",b,b)

	// 1. 按位与 &
	res1 := a & b
	fmt.Printf("a & b 按位与结果：%d,其二进制表示为；%b\n",res1,res1)

	// 2. 按位或 |
	res2 := a | b
	fmt.Printf("a | b 按位或结果：%d,其二进制表示为；%b\n",res2,res2)

	// 3.按位异或 ^
	res3 := a ^ b
	fmt.Printf("a ^ b 按位异或结果：%d,其二进制表示为；%b\n",res3,res3)

	// 4.二进制位清空&^
	res4 := a &^ b
	fmt.Printf("a &^ b 二进制位清空结果：%d,其二进制表示为；%b\n",res4,res4)

	// 5.左移 <<, 相当于：a * 2^2，即60*4=240
	res5 := a << 2   //将a转为二进制，向左移动2个位
	/*
	a  0011 1100
	-> 1111 0000
	 */
	fmt.Printf("a << 2 a向左移动2个位结果：%d,其二进制表示为；%b\n",res5,res5)

	// 5.左移 <<, 相当于：a / 2^2，即60/4=15
	res6 := a >> 2   //将a转为二进制，向左移动2个位
	/*
		a  0011 1100
		-> 0000 1111
	*/
	fmt.Printf("a >> 2 a向右移动2个位结果：%d,其二进制表示为；%b\n",res6,res6)



}

